﻿#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>


//int singleNumber(int* nums, int numsSize)
//{
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < numsSize; i++)
//	{
//		int count = 0;
//		for (j = 0; j < numsSize; j++)
//		{
//			if (nums[j] == nums[i])
//			{
//				count += 1;
//			}
//		}
//		if (count == 1)
//			return nums[i];
//	}
//	return 0;
//}
//
//int main()
//{
//	int arr[] = { 1,2,1,2,7,8,8,7,5 };
//	int sz = sizeof(arr) / sizeof(*arr);
//	printf("%d\n", singleNumber(arr, sz));
//	system("pause");
//}


//struct stu
//{
//	
//	char name[20];//名字
//	int age;//年龄
//	char sex[5];//性别
//	char id[20];//学号
//	
//}; 
//
//struct stu s1 = { "lihua",18,"sex","2022111" }; //全局变量的初始化
//
//int main()
//{
//	struct stu s1 = { "lisi",20,"sex","2022222" };//局部变量初始化
//	void test1(s1);
//	return 0;
//}


//typedef struct stu
//{
//
//	char name[20];//名字
//	int age;//年龄
//	char sex[5];//性别
//	char id[20];//学号
//
//}stu; 
//
//
//struct stu
//{
//
//	char name[20];//名字
//	int age;//年龄
//	char sex[5];//性别
//	char id[20];//学号
//
//}s1;


//struct stu
//{
//
//	char name[20];//名字
//	int age;//年龄
//	char sex[5];//性别
//	char id[20];//学号
//
//};
//
//void test1(struct stu q1)
//{
//	//通过 . 来访问
//	printf("%s\n", q1.name);
//	printf("%d\n", q1.age);
//	printf("%s\n", q1.sex);
//	printf("%s\n", q1.id);
//}
//
//int main()
//{
//	struct stu s1 = { "lisi",20,"sex","2022222" };//局部变量初始化
//	test1(s1);
//	
//	system("pause");
//	return 0;
//}



//struct stu
//{
//
//	char name[20];//名字
//	int age;//年龄
//	char sex[5];//性别
//	char id[20];//学号
//
//};
//
//void test2(struct stu* q1)
//{
//	//通过 . 来访问
//	printf("%s\n", q1->name);
//	printf("%d\n", q1->age);
//	printf("%s\n", q1->sex);
//	printf("%s\n", q1->id);
//}
//
//int main()
//{
//	struct stu s1 = { "lisi",20,"sex","2022222" };//局部变量初始化
//	test2(&s1);
//
//	system("pause");
//	return 0;
//}


////匿名结构体类型
//struct
//{
//	int a;
//	char b;
//	float c;
//}x;


//struct Node
//{
//	int data;
//	struct Node* next;
//};

//struct S1
//{
//	char c1;
//	int i;
//	char c2;
//};


//struct S2
//{
//	char c1;
//	char c2;
//	int i;
//};
//
//struct S3
//{
//	int d;
//	char c;
//	int i;
//};
//
//struct S4
//{
//	char c1;
//	struct S3 s3;
//	int d;
//};

////例如：
//struct S1
//{
//	char c1;
//	int i;
//	char c2;
//};
//struct S2
//{
//	char c1;
//	char c2;
//	int i;
//};
//int main()
//{
//	printf("%zd\n", sizeof(struct S1));
//	printf("%zd\n", sizeof(struct S2));
//
//	system("pause");
//	return 0;
//}


//struct S
//{
//	int data[1000];
//	int num;
//};
//struct S s = { {1,2,3,4}, 1000 };
//
////结构体传参
//void print1(struct S s)
//{
//	printf("%d\n", s.num);
//}
//
////结构体地址传参
//void print2(struct S* ps)
//{
//	printf("%d\n", ps->num);
//}
//
//int main()
//{
//	print1(s);   //传结构体
//	print2(&s); //传地址
//	return 0;
//}


//struct A
//{
//	int _a : 2;
//	int _b : 5;
//	int _c : 10;
//	int _d : 30;
//};
//int main()
//{
//	printf("%d\n", sizeof(struct A));
//	system("pause");
//}

//
////一个例子
//struct S
//{
//	char a : 3;
//	char b : 4;
//	char c : 5;
//	char d : 4;
//};
//struct S s = { 0 };
//s.a = 10;
//s.b = 12;
//s.c = 3;
//s.d = 4;
////空间是如何开辟的？

//一个例子
//struct S
//{
//	char a : 3;
//	char b : 4;
//	char c : 5;
//	char d : 4;
//};
//int main()
//{
//	struct S s = { 0 };
//	s.a = 10;
//	s.b = 12;
//	s.c = 3;
//	s.d = 4;
//	system("pause");
//}
//空间是如何开辟的？



#include<stdio.h>  
#include<stdlib.h>  
//int main()
//{
//    int** a;  //用二级指针动态申请二维数组  
//    int i, j;
//    int m, n;
//    printf("请输入行数\n");
//    scanf("%d", &m);
//    printf("请输入列数\n");
//    scanf("%d", &n);
//    a = (int**)malloc(sizeof(int*) * m);
//    for (i = 0; i < m; i++)
//     a[i] = (int*)malloc(sizeof(int) * n);
//    for (i = 0; i < m; i++)
//    {
//        for (j = 0; j < n; j++)
//        {
//            
//            a[i][j] = 0;
//            printf("%d ", a[i][j]);//输出每个元素地址，每行的列与列之间的地址时连续的，行与行之间的地址不连续
//        }
//        printf("\n");
//    }
//    for (i = 0; i < m; i++)
//        free(a[i]);
//    free(a);
//    system("pause");
//    return 0;
//}

//int main()
//{
//	int** a;
//	int i, j;
//	int m, n;
//	printf("请输入行数\n");
//    scanf("%d", &m);
//	printf("请输入列数\n");
//	scanf("%d", &n);
//	a = calloc(m, sizeof(int*));
//	for (i = 0; i < m; i++)
//	{
//		a[i] = calloc(n, sizeof(int));
//	}
//	system("pause");
//}



//int** generate(int numRows, int* returnSize, int** returnColumnSizes) {
//    //先申请一个二维数组 
//    *returnSize = numRows;
//    returnColumnSizes = calloc(numRows, sizeof(int*));
//    int i = 0;
//    for (i = 0; i < numRows; i++)
//    {
//        returnColumnSizes[i] = calloc(numRows, sizeof(int));
//    }
//    for (i = 0; i < numRows; i++)
//    {
//        returnColumnSizes[i][0] = 1;
//        for (int j = 1; j <= i; j++)
//        {
//            returnColumnSizes[i][j] = returnColumnSizes[i - 1][j] + returnColumnSizes[i - 1][j - 1];
//        }
//    }
//    return returnColumnSizes;
//}

//
//int** generate(int numRows, int* returnSize, int** returnColumnSizes) {
//    *returnSize = numRows;
//    *returnColumnSizes = (int*)malloc(sizeof(int) * numRows);
//    int** ans = (int**)malloc(sizeof(int*) * numRows);
//    //分配行数，一共是numRows行
//    for (int i = 0; i < numRows; i++) {
//        (*returnColumnSizes)[i] = i + 1;
//        ans[i] = (int*)malloc(sizeof(int) * (i + 1));
//        //每一行对应i列，由于i从0开始所以为i+1列
//        ans[i][i] = 1;
//        ans[i][0] = 1;
//        //直接给第一个和最后一个赋值
//        for (int j = 1; j < i; j++) {
//            ans[i][j] = ans[i - 1][j - 1] + ans[i - 1][j];
//            //自身左上和正上的元素相加给自身赋值，符合杨辉三角规律
//        }
//    }
//    return ans;
//}
//
//int main()
//{
//    int k = 5;
//    int sz = 0;
//    int* arr[5];
//    int** ret = generate(k, &sz, arr);
//    for (int i = 0; i < 5; i++)
//    {
//        for (int j = 0; j < 5; j++)
//        {
//            printf("%d ", ret[i][j]);
//        }
//        printf("\n");
//    }
//    system("pause");
//}


typedef struct tree
{
	struct tree* left;
	struct tree* right;
	char data;
}tree;

void preorder(tree* root)
{
	if (root == NULL)
	{
		return;
	}
	printf("%c ", root->data);
	preorder(root->left);
	preorder(root->right);
}

void Middleorder(tree* root)
{
	if (root == NULL)
	{
		return;
	}
	Middleorder(root->left);
	printf("%c ", root->data);
	Middleorder(root->right);
}

void afterorder(tree* root)
{
	if (root == NULL)
	{
		return;
	}
	afterorder(root->left);
	afterorder(root->right);
	printf("%c ", root->data);
}


int main()
{
	tree* A = (tree*)malloc(sizeof(tree));
	A->data = 'A';
	A->left = NULL;
	A->right = NULL;
	tree* B = (tree*)malloc(sizeof(tree));
	B->data = 'B';
	B->left = NULL;
	B->right = NULL;
	tree* C = (tree*)malloc(sizeof(tree));
	C->data = 'C';
	C->left = NULL;
	C->right = NULL;
	tree* D = (tree*)malloc(sizeof(tree));
	D->data = 'D';
	D->left = NULL;
	D->right = NULL;
	tree* E = (tree*)malloc(sizeof(tree));
	E->data = 'E';
	E->left = NULL;
	E->right = NULL;

	A->left = B;
	A->right = C;
	B->left = D;
	B->right = E;
	preorder(A);
	printf("\n");
	Middleorder(A);
	printf("\n");
	afterorder(A);
	system("pause");
}